/*
今年是国际数学联盟确定的“2000——世界数学年”，又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛，组织了一场别开生面的数学智力竞赛的活动，你的一个好朋友 XZ 也有幸得以参加。活动中，主持人给所有参加活动的选手出了这样一道题目：
设有一个长度为 N 的数字串，要求选手使用 K 个乘号将它分成 K+1 个部分，找出一种分法，使得这 K+1 个部分的乘积能够为最大。
同时，为了帮助选手能够正确理解题意，主持人还举了如下的一个例子：
有一个数字串：312，当 N=3,K=1 时会有以下两种分法：
3×12=36
31×2=62
这时，符合题目要求的结果是：31×2=62。
现在，请你帮助你的好朋友 XZ 设计一个程序，求得正确的答案。
输入格式
程序的输入共有两行：
第一行共有 2 个自然数 N,K。
第二行是一个长度为 N 的数字串。
输出格式
结果显示在屏幕上，相对于输入，应输出所求得的最大乘积（一个自然数）。
*/

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;
class bigint{
private:
	string rnum;
	int size;
public:
	void delete_pre_zero(string &znum){ //减去正序数组的前缀0
		int pos=0;
		for(int i=0;i<znum.size();i++){
			if(znum[i] == '0'){
				pos++;
			}else{
				break;
			}
		}

		znum=znum.substr(pos);
	}

	bool operator<(const bigint&other) const { //重载小于号
		if (size==other.size) {
			return out()<other.out();
		}

		return size<other.size;
	}

	bigint operator+(const bigint &other) const { //重载加号
		string rnum1=rnum,rnum2=other.rnum;

		if(rnum1.size()<rnum2.size()){
			rnum1.swap(rnum2);
		}

		int z=0;
		string res;
		for(int i=0;i<rnum2.size();i++){
			int num=rnum1[i]+rnum2[i]-2*'0'+z;
			z=num/10;
			num%=10;
			res+=num+'0';
		}
		for(int i=rnum2.size();i<rnum1.size();i++){
			int num=rnum1[i]-'0'+z;
			z=num/10;
			num%=10;
			res+=num+'0';
		}
		while(z){
			int num=z;
			z=num/10;
			num%=10;
			res+=num+'0';
		}

		return bigint(string(res.rbegin(),res.rend()));
	}

	bigint operator*(const bigint &other){ //重载乘号 //高精度乘高精度
		string rnum1=rnum,rnum2=other.rnum;

		if(rnum1.size()<rnum2.size()){
			rnum1.swap(rnum2);
		}
		bigint res;

		for(int i=0;i<rnum2.size();i++){
			int z=0;
			int pow=rnum2[i]-'0';
			string gudu;

			for(int j=0;j<rnum1.size();j++){
				int num=(rnum1[j]-'0')*pow+z;
				z=num/10;
				num%=10;
				gudu+=num+'0';
			}
			while(z){
				int num=z;
				z=num/10;
				num%=10;
				gudu+=num+'0';
			}

			reverse(gudu.begin(),gudu.end());
			res=res+bigint(gudu);
			rnum1='0'+rnum1;
		}

		return res;
	}

	bigint(string znum){ //带参构造
		delete_pre_zero(znum);
		rnum=string(znum.rbegin(),znum.rend());
		if (znum.empty()) {
			size=0;
			rnum="0";
		}

		size=rnum.size();
	}

	bigint(){
		rnum="0";
		size=1;
	}
	friend ostream& operator<<(ostream &os,bigint &bnum) { //重载输出流
		os<<bnum.out();
		return os;
	}

	string out() const{ //将反序数组正序输出
		return string(rnum.rbegin(),rnum.rend());
	}
};
int main(){
	int n,k;
	cin>>n>>k;
	string num;
	cin>>num;
	
	vector<bigint> f(n+1);
	for(int i=0;i<n;i++){
		f[i]=bigint(num.substr(0,i+1));
	}
	
	for(int i=2;i<=k+1;i++){
		vector<bigint> temp=f;
		f=vector<bigint>(n+1);
		
		for(int j=i-1;j<n;j++){
			for(int l=1;l<=j;l++){
				f[j]=max(f[j],temp[j-l]*bigint(num.substr(j-l+1,l)));
			}
		}
	}
	
	cout<<f[n-1]<<endl;
	return 0;
}